
package mx.uach.compiladores;

import java.io.IOException;
import jdk.nashorn.internal.codegen.CompilerConstants;

/**
 *<ul>
 * <li>sent→expr+term</li>
 * <li>expr→expr-term | term</li>
 * <li>term→0|1|2|3|4|5|6|7|8|9</li>
 * @author User1 Sergio Paz
 * @version 1.0
 *@since 27/02/2014 
 * 
 */
public class AnalizadorSintactico {
    private static final int FIN_SENT =';';
    private static final int SUMA='+';
    private static final int RESTA='-';
    
    private int token;
    private String notacion;
    
    
    //constructor principal de la clase
    public AnalizadorSintactico()
    {
    this.token=-1;
    this.notacion="";
    
    }
    public void iniciarAnalisis()throws IOException{
        this.sent();
    }
    public static void main(String[] args) {
       
        try {
            AnalizadorSintactico analizador=new AnalizadorSintactico();
            analizador.iniciarAnalisis();
        } catch (Exception ex) {
            System.out.println("Ocurrio una anomalia"+ ex.getMessage());
        }
       
    }
    
    
    
    private void sent()throws IOException
   
    {
        this.siguiente(this.token);
        this.expr();
        if(this.token==FIN_SENT)
        {
        System.out.println(this.notacion);
        }
        else{
        throw new Error(String.format("Error de sistaxis, se esperaba (%s)",(char)FIN_SENT ));
        }
    //TODO codigo que se genera
    }
    
    //verifica que las secuencias de esta prodccion sea valida (+ o -)
    //
    private void expr() throws IOException {
        this.term();
        while (true) {
               if(this.token==SUMA){
                   this.siguiente(SUMA);
                   term();
                   this.notacion=String.format("%s%s",this.notacion,(char)SUMA);
               }
               else if(this.token==RESTA) {
                       this.siguiente(RESTA);
                       term();
                       this.notacion=String.format("%s%s",this.notacion,(char)RESTA);
                       
               }else{
                   return;
                   }
              
        } 
        //TODO codigo que se genera
    }
    private void term()throws IOException
    {
            if(Character.isDigit((char)this.token))
            {
            this.notacion=String.format("%s%s",this.notacion,(char)this.token);
            this.siguiente(this.token);
            }
            else{
                throw new Error (String.format("Error de sintaxis token no valido %s",(char)this.token));
                }
    }
    
    //TODO codigo que se genera

    //verifica la secuencia de toeksn sea valida y no sea corrupta
    private void siguiente(int token) throws IOException
    {
        if(this.token==token)
        {
        this.token= System.in.read();
        }
        
            else
            {
            throw new Error(String.format("Error de sintaxis, token no valido %s",(char) this.token));
            }
        }
        
        //generar codigo de llamada a sig token
        //metodo para llamar al siguiente token
       
    }
    

